为了在家用起来 google nest mini 的旁路由方案

缘起

为了把从美国带回来的在家吃灰了几个月的 Google 智能音箱(Google Nest Mini)用起来。而之前由于家里都是终端设备自己搞定科学上网的需求,家里并没有全局的科学上网方案。但这一次由于要用 Google Nest Mini,则必须要搞个设备,搭科学上网环境了。

方案细节

设备

家里还有个吃灰几年的极路由三(HiWiFi HC5861),用的是联发科的架构(MediaTek MT7620A),这一次打算将其用起来,作为科学上网的设备。

于是将其刷上最新的 OpenWRT。具体过程就不说了。

然后因为我所有的设备,但凡支持,都会起 zerotier,于是这太极三也装上了 zerotier,并加入我的网络(跟我的 vps 以及其他设备在同一个虚拟的 zerotier 网段)

方案变迁

socks proxy(V2Ray) 方案

因为设备连接 WiFi 时大都会允许设置一个 proxy,所以,在最初的方案里,我是想让这台极三充当一个 socks proxy 的角色,当需要科学上网的设备(这里就是 Google Nest Mini)通过 WiFi 接入家庭网络的时候,将 proxy 指过来,这样实现设备的科学上网。

这个方案也简单,只需要在极三上起一个 V2Ray 服务,这个服务的入站(inbound)只需要开一个整个局域网共享的 socks proxy 的支持就可以了,出站(outbound)当然是对接海外 vps 上的 V2Ray 服务。

最后,这个方案的环境弄好了,结果配 Google Nest Mini 的时候发现无法让其使用 socks proxy,故而最后这个方案没有用起来。

zerotier+透明代理 方案

这个方案是想设备(Google Nest Mini)用 WiFi 来连科学上网设备极三,然后在极三上用 iptables 把所有流量转发到海外 vps 的 zerotier 那个网卡所在的 IP 地址的 socks proxy 端口(V2Ray 服务支持)上。

这个方案的问题在于我极三的 WiFi 我用来连家里的 WiFi 了,再要起一个 sid 接受 WiFi 连接呢,配置起来比较麻烦,而且,可能会影响家里原来 WiFi 的信号(因为 WiFi 会互相干扰)。

最后,这个方案虽然也没被放弃,但是极三上的 zerotier 却是配好了。

旁路由+透明代理方案

这是最终实施并生效的方案。

大致情况如下:

  • 极路由三上跑 V2Ray 服务
    • 入站启用透明代理和 socks 代理(不是必须的)
    • 路由配置成私有地址和中国国内的网站直连,其他走科学上网。
    • 出站配直连和走海外 vps 上的 V2Ray 服务(我用的是 websocket 方式)
  • 主路由的 DHCP 设置里
    • 绑定极路由三的 mac 地址和一个固定 IP
    • 绑定设备 Google Nest Mini 的 mac 地址和另外一个固定 IP,并强制推送网关地址为极路由三的 IP 地址(上一步配置的)

实施步骤及具体配置

极三上安装 V2Ray

这其实是个难点。极三上能装软件的空间只有 10M,结果直接 opkg install v2ray-core 出来的可执行文件 v2ray 直接有 20+M,显然不能直接装。幸好有大佬把 v2ray-core port 到了 OpenWRT 上[^1],他编了个 v2ray-core-mini 勉强可用。具体在极三上:

1
2
3
4
5
cd /tmp
wget \
https://github.com/kuoruan/openwrt-v2ray/releases/download/v4.45.2-1/v2ray-core-mini_4.45.2-1_mipsel_24kc.ipk
opkg install v2ray-core-mini*.ipk
rm v2ray-core-mini*.ipk

然后还要一些数据(因为 v2ray-core-mini 包里不含 geoip.dat 和 geosite.dat 等数据文件,这些文件太大了),我们这里手工下载了一个 geosite.dat,这个就够了,那个 geoip.dat 有二十多兆,太大了。

1
2
3
cd /usr/bin
wget https://github.com/v2fly/domain-list-community/releases/download/20230403032550/dlc.dat
mv dlc.dat geosite.dat

最好还装上 V2Ray 服务的 luci 包,这样就可以在 web 上直接配置了。注意:有个叫 luci-i18n-v2ray-zh-cn 的中文语言包我没装,主要是为了节省空间,这个也不是必须的。

1
2
3
4
cd /tmp
wget https://github.com/kuoruan/luci-app-v2ray/releases/download/v1.5.6-1/luci-app-v2ray_1.5.6_all.ipk
opkg install luci-app-v2ray*.ipk
rm luci-app-v2ray*.ipk

极三的(网络)上联配置

极三可以用 wan 口去接主路由的 lan 口,但我这里是用的 WiFi 去连的主路由的 WiFi,这种方式使极三上的网。后面的 dhcp 配置里会有所体现。

极三上配置 V2Ray

弄清楚逻辑以后配置部分也没啥可讲的。就是:

  • 两个入站(socks 和 dokodemo_door,前者不是必须的,因为我们这个方案里没有用到)
  • 几个出站(最主要的是两个:freedom 和 vmess,这两个一个是直连,还有一个是连海外 VPS 上的 V2Ray)
  • 一些路由,比如私网直连、geosite:cn(中国的网站) 直连。

注意:

  • 路由规则里不能使用 geoip: 开头的写法,因为我们的数据文件里没放 geoip.dat,同理,geosite: 是可以的。
  • 透明代理(dokodemo_door)的设置里,proxy mode 选 default dokodemo

主路由上的配置

主路由也是 OpenWRT,主要是修改其 DHCP 配置,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat >> /etc/config/dhcp << EOF
config host
option name 'gee3-5g'
option mac '00:00:00:FF:FF:FF'
option ip '10.0.0.254'

config host
option name 'google-nest-mini'
option mac '00:00:00:FF:FF:FE'
option ip '10.0.0.253'
option tag '2gw'

config tag '2gw'
list dhcp_option '3,10.0.0.254'
option force '1'
EOF

/etc/init.d/dnsmasq restart # restart dhcp server

注意:

  • “00:00:00:FF:FF:FF” 和 “00:00:00:FF:FF:FE” 分别是极三和 Google Nest Mini 的 mac 地址(瞎写的,真实的数据是隐私)
  • “10.0.0.254” 和 “10.0.0.253” 分别是极三和 Google Nest Mini 的 IP 地址(这也是杜撰的,真实的 IP 是隐私)
  • 主路由的正常推的网关地址应该是 “10.0.0.1”(这里给 Google Nest Mini 推送了旁路由,IP 地址是 10.0.0.254)

附录

[^1]:V2Ray for OpenWrt